var _ = require("lodash");

// _.differenceWith(array, [values], [comparator])
// array (Array): 要检查的数组。
// [values] (...Array): 排除的值。
// [comparator] (Function): comparator 调用每个元素
// 跟difference的效果基本一致，但是他会调用一个迭代器，来比较array，values中的元素
// 他和differenceBy的区别在于，他给出的一个比较器是自定义的，这个比较器并不是遍历给定的两个数组参数
// 而是会对 array中的每个元素与数组中的每个元素（调用迭代器函数）进行对比
// 然后排除array中符合比较结果为真的元素

var objects = [
  { x: 1, y: 2 },
  { x: 2, y: 1 },
];

// 这里的isEqual就是判断对象相等的方法，执行深比较来确定两者的值是否相等
let asd = _.differenceWith(objects, [{ x: 1, y: 2 }], _.isEqual);
// console.log(asd);

const users1 = [
  { id: 1, name: "Alice" },
  { id: 2, name: "bob" },
  { id: 5, name: "bob" },
  { id: 3, name: "Charlie" },
];

const users2 = [
  { id: 2, name: "Bob" },
  { id: 4, name: "Dave" },
];

// 从这里就可以看出，differenceWith的功能更为强大些
const difference = _.differenceWith(users1, users2, (user1, user2) => {
  // 比较时忽略名字的大小写
  return user1.name.toLowerCase() === user2.name.toLowerCase();
});

// console.log(difference);

// 对于isEqual的解释
//这个方法支持比较 arrays, array buffers, booleans, date objects, error objects, maps, numbers,
// Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 对象值比较自身的属性，
// 不包括继承的和可枚举的属性。 不支持函数和DOM节点比较

let obj171 = {
  name: "jack",
  age: 18,
};
let obj172 = {
  name: "jack",
  age: 18,
};
let res17 = _.isEqual(obj171, obj172);
console.log(res17);
